﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
/*
 * 继承中访问权限与多继承
 * 
 *          private：用private修饰父类当中的成员变量/方法
 *          
 *              —父类内：可以访问
 *              
 *              —子类内：不可以访问
 *              
 *              —外部类内：不可以访问
 *              
 *          protected：用protected修饰父类当中的成员变量/方法
 *          
 *              —父类内：可以访问
 *              
 *              —子类内：可以访问
 *              
 *              —外部类内：不可以访问
 *              
 *          public：完全开放
 */

namespace 继承_继承中访问权限控制
{

    //问题：
    //      1 Father是原来的程序员设计的类，新来的项目组成员不可以直接修改原来的类
    //      2 Father类中的age
    //          需求1：不能被外部类访问
    //          需求2：可以被继承者访问
    //使用protected进行权限管理
    class Father
    {
        //不想让外界直接修改我的年龄
        protected int age = 50;
    }

    //刚好需要继承Father，使用其中的age变量
    class Son : Father
    {
        public void Test()
        {
            Console.WriteLine(age);
        }
    }


    //在多层继承当中：
    //      1 private 成员在子类/孙子类/。。。当中都无法访问
    //      2 protected 成员在子类/孙子类/。。。当中都可以访问
    //      3 public 全面开放
    class Animal
    {
        protected string name = "";

        public int age = 0;

        public void Test()
        {
            Console.WriteLine("Animal");
        }
    }

    class Pet : Animal
    {
        new public int age = 1;

        public int id = 0;

        new public void Test()
        {
            Console.WriteLine("Pet");
        }

        
    }

    class Dog : Pet
    {
        new public int age = 2;
        public void speak()
        {
            Console.WriteLine(name + "wang~~");
        }
        new public void Test()
        {
            Console.WriteLine("Dog");
        }
    }
    internal class Program
    {
        static void Main(string[] args)
        {
            //Father father = new Father();
            //father.age = 10;

            //Dog dog = new Dog();
            //dog.name = "ahuang";
            //dog.id = 1;
            //dog.speak();

            Animal animal = new Animal();
            Console.WriteLine(animal.age);
            animal.Test();

            Pet pet = new Pet();
            Console.WriteLine(pet.age);
            pet.Test();

            Dog dog = new Dog();
            Console.WriteLine(dog.age);
            dog.Test();

            Console.Read();

        }
    }
}
